package utils;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *  JDBC常量类
**/
class Constants{
    public static final String driver = "com.mysql.cj.jdbc.Driver";
    public static final String url = "jdbc:mysql://127.0.0.1:3306/blogs-manager?useUnicode=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=GMT%2B8";
    public static final String username="root";
    public static final String password="bailei12233";
}
public class JdbcUtils {
    /*  静态内部块，随着类的加载执行，启用JDBC驱动程序 */
    static {
        try {
            Class.forName(Constants.driver);
        }catch (Exception e){
            System.out.println("驱动加载失败！");
        }
    }
    /* LinkJdbc连接数据库 */
    private static Connection LinkJdbc(){
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(Constants.url, Constants.username, Constants.password);
        } catch (Exception e) {
            System.out.println("获取连接失败！");
        }
        return conn;
    }
    /* JdbcUpdate执行更新操作 */
    public static int JdbcUpdate(String sql,Object...params){
        //链接数据库
        Connection conn = LinkJdbc();
        //设置一个空的执行sql对象
        PreparedStatement ps = null;
        int rows=0;
        try {
            //获取使用占位符的SQl语句
            ps = LinkJdbc().prepareStatement(sql);
            //将params对象上的参数给SQL语句中的站位符分别设置
            //如果params===null的话，证明该sql语句没有缺省参数
            if(params!=null&&params.length>0){
                for(int i=0;i<params.length;i++){
                    ps.setObject(i+1,params[i]);
                }
            }
            //执行更新操作 返回受影响的行数
            rows = ps.executeUpdate();
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }finally{
            //执行完语句将资源释放
            try {
                closeJDBC(conn, ps, null);
            } catch (SQLException e) {
                System.out.println(e.getMessage());
            }
        }
        return rows;
    }
    /* JdbcQuery执行查询操作 */
    public static List<Map<String, Object>> JdbcQuery(String sql, Object...params){
        //链接数据库
        Connection conn = LinkJdbc();
        //设置一个空的执行sql对象
        PreparedStatement ps=null;
        //创捷一个 结果集
        ResultSet set=null;
        //创建一个链表表数组 用于存储 sql键值对
        List<Map<String, Object>> list = new ArrayList<>();
        try {
            //获取使用占位符的SQl语句
            ps = conn.prepareStatement(sql);
            //将params对象上的参数给SQL语句中的站位符分别设置
            //如果params===null的话，证明该sql语句没有缺省参数
            if(params!=null&&params.length>0){
                for(int i=0;i<params.length;i++){
                    ps.setObject(i+1,params[i]);
                }
            }
            //执行更新操作 返回受影响的结果集
            set = ps.executeQuery();
            //ResultSetMetaData 类
            //可用于获取关于 ResultSet 对象中列的类型和属性信息的对象
            ResultSetMetaData rsmd = set.getMetaData();
            int columnCount = rsmd.getColumnCount();
            while(set.next()){
                Map<String,Object> map = new HashMap<>();
                for(int i=1;i<=columnCount;i++){
                    //getColumnName()获取指定列的名称
                    map.put(rsmd.getColumnName(i), set.getObject(i));
                }
                list.add(map);
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }finally {
            try {
                closeJDBC(conn,ps,set);
            } catch (SQLException e) {
                System.out.println(e.getMessage());
            }
        }
        //返回结果集，每一条结果为所有查询的字段名和字段值为键值对的Map集合
        return list;
    }

    /* 释放资源 */
    private static void closeJDBC(Connection conn,PreparedStatement ps,ResultSet rs) throws SQLException{
        if(rs!=null){
            rs.close();
        }
        if(ps!=null){
            ps.close();
        }
        if(conn!=null){
            conn.close();
        }
    }
}
